home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 140 / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin / tools / dshell / dsh333bs.lzh / main.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-09-28  |  6.1 KB  |  329 lines

  1. /*
  2.     dshell    v3
  3.  
  4.     メインルーチン
  5. */
  6.  
  7. #include    "dsh.h"
  8. #include    <signal.h>
  9.  
  10.  
  11. static uchar fkeyModeBak;
  12. static uchar skeyModeBak;
  13. static uchar curModeBak;
  14.  
  15. static void
  16. handleBreak(int sig)
  17. {
  18.     if (GETPDB() != (struct PDBADR *)_PSP)
  19.         EXIT2(0x200);
  20.     signal(sig, handleBreak);
  21.     nouse_fnk();
  22.     dout();
  23.     B_PRINT("\x1a""中断しました\r\n");
  24.     dsh_abort(0x200);
  25. }
  26.  
  27.  
  28. static volatile void 
  29. dabort2(const char *mes)
  30. {
  31.     printf("%s\n%s", mes, usage_mes);
  32.     dsh_abort(1);
  33. }
  34.  
  35.  
  36. static ushort
  37. getColor(uchar *p)
  38. {
  39.     int c, cl, j;
  40.  
  41.     if (*p != '-' && *p != '=') {
  42.         dabort2("カラーコードの指定の前に、'-' をつけてください");
  43.     }
  44.     p++;
  45.     if (strlen(p) != 4) {
  46.         dabort2("カラーコードは16進数4桁で指定してください");
  47.     }
  48.     c = 0;
  49.     for (j = 0; j < 4; j++) {
  50.         cl = toupper(*p++);
  51.         c <<= 4;
  52.         if ('0' <= cl && cl <= '9') {
  53.             c += cl - '0';
  54.         } else if ('A' <= cl && cl <= 'F') {
  55.             c += cl - 'A' + 10;
  56.         } else {
  57.             dabort2("カラーコードは16進数4桁で指定してください");
  58.         }
  59.     }
  60.     return c;
  61. }
  62.  
  63.  
  64. void 
  65. main(int argc, char *argv[])
  66. {
  67.     int i, j;
  68.     char *p, *fname = NULL, *bgCutName = NULL;
  69.  
  70.     B_COLOR(3);
  71.     if (B_SFTSNS() & OPT2_KEY) {
  72.         debugMode = TRUE;
  73.         LEDMOD(2, 1);
  74.     }
  75.     setenv_and_export("DSHELLSTAT", "");
  76.  
  77.     fkeyModeBak = C_FNKMOD(-1);
  78.     curModeBak = B_BPEEK((uchar *)0x993);    // カーソルON/OFFモードを待避
  79.     skeyModeBak = B_BPEEK((uchar *)0xbc1);    // ソフトウェアキーボード表示モードを待避
  80.  
  81.     if (argc < 2) {
  82.         dabort2(Sysmes);
  83.     }
  84.     for (i = 1; i < argc; i++) {
  85.         p = argv[i];
  86.         switch (*p) {
  87.         case '-':
  88.         case '/':
  89.             switch (*++p) {
  90.             case 't':
  91.             case 'T':
  92.                 if (*++p == '\0') {
  93.                     if (++i == argc) {
  94.                         dabort2("タイトルの指定方法に誤りがあります");
  95.                     }
  96.                     p = argv[i];
  97.                 }
  98.                 if (strlen(p) > 40) {
  99.                     dabort2("タイトルネームは40文字までで指定して下さい");
  100.                 }
  101.                 Titlename = p;
  102.                 break;
  103.             case '0':    /* 96 */
  104.             case '1':    /* 桁 */
  105.             case '2':    /* 時 */
  106.             case '3':    /* 有 */
  107.             case '4':    /* 効 */
  108.                 j = *p++ - '0';
  109.                 ogr_col[j] = getColor(p);
  110.                 break;
  111.             case '-':
  112.             case '/':
  113.                 if (*p == *(p - 1)) {
  114.                     j = *(p + 1);
  115.                     if (j >= '1' && j <= '3')
  116.                         otx_col[j - '0'] = getColor(p + 2);
  117.                 }
  118.                 break;
  119.             case 'k':
  120.             case 'K':
  121.                 j = *++p - '0';
  122.                 if ((j < 0) || (j > 1)) {
  123.                     dabort2("キーボード使用フラグは0か1で指定してください");
  124.                 }
  125.                 Kflg = j;
  126.                 break;
  127.             case 'j':
  128.             case 'J':
  129.                 j = *++p - '0';
  130.                 if ((j < 0) || (j > 1)) {
  131.                     dabort2("ジョイスティック使用フラグは0か1で指定してください");
  132.                 }
  133.                 Jflg = j;
  134.                 break;
  135.             case 'C':
  136.             case 'c':
  137.                 j = *++p;
  138.                 if ((j != 'S') && (j != 's')) {
  139.                     dabort2("パラメータが違います\n");
  140.                 }
  141.                 j = *++p - '0';
  142.                 if ((j < 0) || (j > 1)) {
  143.                     dabort2("パラメータが違います\n");
  144.                 }
  145.                 CSpdUp = j;
  146.                 break;
  147.             case 'R':
  148.             case 'r':
  149.                 j = *++p;
  150.                 if ((j != 'W') && (j != 'w')) {
  151.                     dabort2("パラメータが違います\n");
  152.                 }
  153.                 j = *++p - '0';
  154.                 if ((j < 0) || (j > 1)) {
  155.                     dabort2("パラメータが違います\n");
  156.                 }
  157.                 Rwin_len = (j == 0) ? RW_HALF : RW_FULL;
  158.                 break;
  159.             case 'o':
  160.             case 'O':
  161.                 if (striEqu("mitmsg", p + 1)) {
  162.                     OmitMsgFlg = TRUE;
  163.                 }
  164.                 break;
  165.             case 'G':
  166.             case 'g':
  167.                 p++;
  168.                 if (*argv[i] == '-' && *p == '\0') {
  169.                     GMODE = 0;
  170.                 } else {
  171.                     switch (*p) {
  172.                     case '0':
  173.                     case '1':
  174.                     case '2':
  175.                         GMODE = *p - '0';
  176.                         break;
  177.                     }
  178.                 }
  179.                 break;
  180.             case 'B':
  181.             case 'b':
  182.                 if (*++p == '\0') {
  183.                     if (++i == argc)
  184.                         dabort2("");
  185.                     p = argv[i];
  186.                 }
  187.                 bgCutName = p;
  188.                 break;
  189.             case 'D':
  190.             case 'd':
  191.                 if (striEqu(p, "debug")) {
  192.                     debugMode = TRUE;
  193.                     LEDMOD(2, 1);
  194.                     break;
  195.                 }
  196.                 if (j = dinstrchr(++p, '=')) {
  197.                     int n = strlen(p);
  198.                     SHELLVAR *vp = malloc(sizeof(SHELLVAR) + n + 1);
  199.                     if (vp == NULL)
  200.                         dabort2("ヒープ容量が不足しています\n");
  201.                     strcpy(vp->name, p);
  202.                     vp->name[--j] = '\0';    // '=' -> '\0';
  203.                     vp->next = sysVarListHead;
  204.                     sysVarListHead = vp;
  205.                 }
  206.                 break;
  207.             default:
  208.                 dabort2(Sysmes);
  209.                 break;
  210.             }
  211.             break;
  212.         case '+':
  213.             j = *++p;
  214.             if ((j == 'G' || j == 'g') && (*(p + 1) == '\0')) {
  215.                 GMODE = 1;
  216.             }
  217.             break;
  218.         default:
  219.             if (fname == NULL) {
  220.                 fname = p;
  221.             } else {
  222.                 /* -Tオプションなしのタイトル指定(昔の方式)も有効にする */
  223.                 Titlename = p;
  224.             }
  225.         }
  226.     }
  227.  
  228.     if (fname == NULL) {
  229.         dabort2("ファイル名を指定してください");
  230.     }
  231.     if (bgCutName != NULL) {
  232.         if (loadBgCut(bgCutName) < 0)
  233.             dabort2("CUTファイルが読み込めませんでした");
  234.         bgCut = &cut[0];
  235.     }
  236.  
  237.     check_joystick();    /* ジョイスティックチェック */
  238.  
  239.     if (init_bookmark())
  240.         dabort2("calloc() error!");
  241.  
  242.     /* 画面色初期設定 */
  243.     for (i = 0; i < 5; i++)
  244.         gr_col[i] = ogr_col[i];
  245.     for (i = 0; i < 4; i++)
  246.         tx_col[i] = otx_col[i];
  247.  
  248.     B_PRINT("");        /* condrv バッファ記録off */
  249.  
  250.     OS_CUROF();
  251.     vsync();
  252.     B_WPOKE(VIDEOR2, 0);
  253.     set_g_mode(GMODE);
  254.     use_fnk();
  255.     din(TRUE);
  256.  
  257.     LEDMOD(0, 0);    // かなキー OFF
  258.     LEDMOD(1, 0);    // ローマ字キー OFF
  259.     LEDMOD(2, 0);    // コード入力キー OFF
  260.     LEDMOD(4, 0);    // INSキー OFF
  261.     LEDMOD(6, 0);    // 全角キー OFF
  262.     {
  263.         int x, y;
  264.  
  265.         mspos(&x, &y);
  266.         if (y < 16)
  267.             y = 16;
  268.         else if (y >= 16*31)
  269.             y = 16*31 - 1;
  270.         if (x < 16)
  271.             x = 16;
  272.         setmspos(x, y);
  273.     }
  274.     signal(SIGINT, handleBreak);
  275.     signal(SIGABRT, handleBreak);
  276.  
  277.     defGMODE = GMODE;
  278.     dshell(fname);
  279.  
  280.     dend();
  281. }
  282.  
  283.  
  284. /*
  285.     シェルおわり
  286. */
  287. volatile void 
  288. dend()
  289. {
  290.     use_fnk();
  291.     if (fkeyModeBak != 3)
  292.         nouse_fnk();
  293.     dout();
  294.     B_PRINT("");
  295.     if (!OmitMsgFlg) {
  296.         printf("\n%s\n", Sysmes);
  297.     }
  298.     dsh_abort(0);
  299. }
  300.  
  301.  
  302. /*
  303.     condrv のバッファ登録をonにし、プロセス終了
  304. */
  305. volatile void 
  306. dsh_abort(int ex_flag)
  307. {
  308.     int x, y;
  309.  
  310.     setFont16(NULL);
  311.     if (defFont16.table[0] != NULL)
  312.         setHanFont16(defFont16.table[0]);
  313.     LEDMOD(0, 0);    // かなキー OFF
  314.     LEDMOD(1, 0);    // ローマ字キー OFF
  315.     LEDMOD(2, 0);    // コード入力キー OFF
  316.     LEDMOD(6, 0);    // 全角キー OFF
  317.     B_COLOR(3);
  318.     OS_CUROF();
  319.     if (!curModeBak)
  320.         OS_CURON();
  321.     mspos(&x, &y);
  322.     mouse(0);
  323.     if (!skeyModeBak)
  324.         mouse(4);
  325.     setmspos(x, y);
  326.     B_PRINT("");
  327.     exit(ex_flag);
  328. }
  329.